{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import datetime\n",
    "import math\n",
    "from Orange.data import Domain, DiscreteVariable, ContinuousVariable\n",
    "from orangecontrib.associate.fpgrowth import *\n",
    "import Orange\n",
    "import numpy as np\n",
    "from Orange.data import Domain, Table"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "cs_mba = pd.read_excel(io=r'Online Retail.xlsx')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "cs_mba_uk = cs_mba[cs_mba.Country == 'United Kingdom']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>InvoiceNo</th>\n",
       "      <th>StockCode</th>\n",
       "      <th>Description</th>\n",
       "      <th>Quantity</th>\n",
       "      <th>InvoiceDate</th>\n",
       "      <th>UnitPrice</th>\n",
       "      <th>CustomerID</th>\n",
       "      <th>Country</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>536365</td>\n",
       "      <td>85123A</td>\n",
       "      <td>WHITE HANGING HEART T-LIGHT HOLDER</td>\n",
       "      <td>6</td>\n",
       "      <td>2010-12-01 08:26:00</td>\n",
       "      <td>2.55</td>\n",
       "      <td>17850.0</td>\n",
       "      <td>United Kingdom</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>536365</td>\n",
       "      <td>71053</td>\n",
       "      <td>WHITE METAL LANTERN</td>\n",
       "      <td>6</td>\n",
       "      <td>2010-12-01 08:26:00</td>\n",
       "      <td>3.39</td>\n",
       "      <td>17850.0</td>\n",
       "      <td>United Kingdom</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>536365</td>\n",
       "      <td>84406B</td>\n",
       "      <td>CREAM CUPID HEARTS COAT HANGER</td>\n",
       "      <td>8</td>\n",
       "      <td>2010-12-01 08:26:00</td>\n",
       "      <td>2.75</td>\n",
       "      <td>17850.0</td>\n",
       "      <td>United Kingdom</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>536365</td>\n",
       "      <td>84029G</td>\n",
       "      <td>KNITTED UNION FLAG HOT WATER BOTTLE</td>\n",
       "      <td>6</td>\n",
       "      <td>2010-12-01 08:26:00</td>\n",
       "      <td>3.39</td>\n",
       "      <td>17850.0</td>\n",
       "      <td>United Kingdom</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>536365</td>\n",
       "      <td>84029E</td>\n",
       "      <td>RED WOOLLY HOTTIE WHITE HEART.</td>\n",
       "      <td>6</td>\n",
       "      <td>2010-12-01 08:26:00</td>\n",
       "      <td>3.39</td>\n",
       "      <td>17850.0</td>\n",
       "      <td>United Kingdom</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  InvoiceNo StockCode                          Description  Quantity  \\\n",
       "0    536365    85123A   WHITE HANGING HEART T-LIGHT HOLDER         6   \n",
       "1    536365     71053                  WHITE METAL LANTERN         6   \n",
       "2    536365    84406B       CREAM CUPID HEARTS COAT HANGER         8   \n",
       "3    536365    84029G  KNITTED UNION FLAG HOT WATER BOTTLE         6   \n",
       "4    536365    84029E       RED WOOLLY HOTTIE WHITE HEART.         6   \n",
       "\n",
       "          InvoiceDate  UnitPrice  CustomerID         Country  \n",
       "0 2010-12-01 08:26:00       2.55     17850.0  United Kingdom  \n",
       "1 2010-12-01 08:26:00       3.39     17850.0  United Kingdom  \n",
       "2 2010-12-01 08:26:00       2.75     17850.0  United Kingdom  \n",
       "3 2010-12-01 08:26:00       3.39     17850.0  United Kingdom  \n",
       "4 2010-12-01 08:26:00       3.39     17850.0  United Kingdom  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cs_mba_uk.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Remove returned item as we are only interested in the buying patterns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "cs_mba_uk = cs_mba_uk[~(cs_mba_uk.InvoiceNo.str.contains(\"C\") == True)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "cs_mba_uk = cs_mba_uk[~cs_mba_uk.Quantity<0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "cs_mba_ger = cs_mba[cs_mba.Country == 'Germany']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(9495, 8)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cs_mba_ger.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "cs_mba_ger = cs_mba_ger[~(cs_mba_ger.InvoiceNo.str.contains(\"C\") == True)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "cs_mba_ger = cs_mba_ger[~cs_mba_ger.Quantity<0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>InvoiceNo</th>\n",
       "      <th>StockCode</th>\n",
       "      <th>Description</th>\n",
       "      <th>Quantity</th>\n",
       "      <th>InvoiceDate</th>\n",
       "      <th>UnitPrice</th>\n",
       "      <th>CustomerID</th>\n",
       "      <th>Country</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1109</th>\n",
       "      <td>536527</td>\n",
       "      <td>22809</td>\n",
       "      <td>SET OF 6 T-LIGHTS SANTA</td>\n",
       "      <td>6</td>\n",
       "      <td>2010-12-01 13:04:00</td>\n",
       "      <td>2.95</td>\n",
       "      <td>12662.0</td>\n",
       "      <td>Germany</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1110</th>\n",
       "      <td>536527</td>\n",
       "      <td>84347</td>\n",
       "      <td>ROTATING SILVER ANGELS T-LIGHT HLDR</td>\n",
       "      <td>6</td>\n",
       "      <td>2010-12-01 13:04:00</td>\n",
       "      <td>2.55</td>\n",
       "      <td>12662.0</td>\n",
       "      <td>Germany</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1111</th>\n",
       "      <td>536527</td>\n",
       "      <td>84945</td>\n",
       "      <td>MULTI COLOUR SILVER T-LIGHT HOLDER</td>\n",
       "      <td>12</td>\n",
       "      <td>2010-12-01 13:04:00</td>\n",
       "      <td>0.85</td>\n",
       "      <td>12662.0</td>\n",
       "      <td>Germany</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1112</th>\n",
       "      <td>536527</td>\n",
       "      <td>22242</td>\n",
       "      <td>5 HOOK HANGER MAGIC TOADSTOOL</td>\n",
       "      <td>12</td>\n",
       "      <td>2010-12-01 13:04:00</td>\n",
       "      <td>1.65</td>\n",
       "      <td>12662.0</td>\n",
       "      <td>Germany</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1113</th>\n",
       "      <td>536527</td>\n",
       "      <td>22244</td>\n",
       "      <td>3 HOOK HANGER MAGIC GARDEN</td>\n",
       "      <td>12</td>\n",
       "      <td>2010-12-01 13:04:00</td>\n",
       "      <td>1.95</td>\n",
       "      <td>12662.0</td>\n",
       "      <td>Germany</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     InvoiceNo StockCode                          Description  Quantity  \\\n",
       "1109    536527     22809              SET OF 6 T-LIGHTS SANTA         6   \n",
       "1110    536527     84347  ROTATING SILVER ANGELS T-LIGHT HLDR         6   \n",
       "1111    536527     84945   MULTI COLOUR SILVER T-LIGHT HOLDER        12   \n",
       "1112    536527     22242        5 HOOK HANGER MAGIC TOADSTOOL        12   \n",
       "1113    536527     22244           3 HOOK HANGER MAGIC GARDEN        12   \n",
       "\n",
       "             InvoiceDate  UnitPrice  CustomerID  Country  \n",
       "1109 2010-12-01 13:04:00       2.95     12662.0  Germany  \n",
       "1110 2010-12-01 13:04:00       2.55     12662.0  Germany  \n",
       "1111 2010-12-01 13:04:00       0.85     12662.0  Germany  \n",
       "1112 2010-12-01 13:04:00       1.65     12662.0  Germany  \n",
       "1113 2010-12-01 13:04:00       1.95     12662.0  Germany  "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cs_mba_ger.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(457,)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cs_mba_ger.InvoiceNo.value_counts().shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'Country': 'Germany', 'InvoiceNo': 536527, 'InvoiceDate': Timestamp('2010-12-01 13:04:00'), 'CustomerID': 12662.0, 'Description': 'SET OF 6 T-LIGHTS SANTA', 'Quantity': 6, 'StockCode': 22809, 'UnitPrice': 2.95}\n",
      "{'Country': 'Germany', 'InvoiceNo': 536527, 'InvoiceDate': Timestamp('2010-12-01 13:04:00'), 'CustomerID': 12662.0, 'Description': 'ROTATING SILVER ANGELS T-LIGHT HLDR', 'Quantity': 6, 'StockCode': 84347, 'UnitPrice': 2.55}\n",
      "{'Country': 'Germany', 'InvoiceNo': 536527, 'InvoiceDate': Timestamp('2010-12-01 13:04:00'), 'CustomerID': 12662.0, 'Description': 'MULTI COLOUR SILVER T-LIGHT HOLDER', 'Quantity': 12, 'StockCode': 84945, 'UnitPrice': 0.85}\n",
      "{'Country': 'Germany', 'InvoiceNo': 536527, 'InvoiceDate': Timestamp('2010-12-01 13:04:00'), 'CustomerID': 12662.0, 'Description': '5 HOOK HANGER MAGIC TOADSTOOL', 'Quantity': 12, 'StockCode': 22242, 'UnitPrice': 1.65}\n",
      "{'Country': 'Germany', 'InvoiceNo': 536527, 'InvoiceDate': Timestamp('2010-12-01 13:04:00'), 'CustomerID': 12662.0, 'Description': '3 HOOK HANGER MAGIC GARDEN', 'Quantity': 12, 'StockCode': 22244, 'UnitPrice': 1.95}\n"
     ]
    }
   ],
   "source": [
    "\n",
    "for record in cs_mba_ger.head().to_dict('records'):\n",
    "    print(record)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>InvoiceNo</th>\n",
       "      <th>StockCode</th>\n",
       "      <th>Description</th>\n",
       "      <th>Quantity</th>\n",
       "      <th>InvoiceDate</th>\n",
       "      <th>UnitPrice</th>\n",
       "      <th>CustomerID</th>\n",
       "      <th>Country</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1109</th>\n",
       "      <td>536527</td>\n",
       "      <td>22809</td>\n",
       "      <td>SET OF 6 T-LIGHTS SANTA</td>\n",
       "      <td>6</td>\n",
       "      <td>2010-12-01 13:04:00</td>\n",
       "      <td>2.95</td>\n",
       "      <td>12662.0</td>\n",
       "      <td>Germany</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1110</th>\n",
       "      <td>536527</td>\n",
       "      <td>84347</td>\n",
       "      <td>ROTATING SILVER ANGELS T-LIGHT HLDR</td>\n",
       "      <td>6</td>\n",
       "      <td>2010-12-01 13:04:00</td>\n",
       "      <td>2.55</td>\n",
       "      <td>12662.0</td>\n",
       "      <td>Germany</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1111</th>\n",
       "      <td>536527</td>\n",
       "      <td>84945</td>\n",
       "      <td>MULTI COLOUR SILVER T-LIGHT HOLDER</td>\n",
       "      <td>12</td>\n",
       "      <td>2010-12-01 13:04:00</td>\n",
       "      <td>0.85</td>\n",
       "      <td>12662.0</td>\n",
       "      <td>Germany</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1112</th>\n",
       "      <td>536527</td>\n",
       "      <td>22242</td>\n",
       "      <td>5 HOOK HANGER MAGIC TOADSTOOL</td>\n",
       "      <td>12</td>\n",
       "      <td>2010-12-01 13:04:00</td>\n",
       "      <td>1.65</td>\n",
       "      <td>12662.0</td>\n",
       "      <td>Germany</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1113</th>\n",
       "      <td>536527</td>\n",
       "      <td>22244</td>\n",
       "      <td>3 HOOK HANGER MAGIC GARDEN</td>\n",
       "      <td>12</td>\n",
       "      <td>2010-12-01 13:04:00</td>\n",
       "      <td>1.95</td>\n",
       "      <td>12662.0</td>\n",
       "      <td>Germany</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     InvoiceNo StockCode                          Description  Quantity  \\\n",
       "1109    536527     22809              SET OF 6 T-LIGHTS SANTA         6   \n",
       "1110    536527     84347  ROTATING SILVER ANGELS T-LIGHT HLDR         6   \n",
       "1111    536527     84945   MULTI COLOUR SILVER T-LIGHT HOLDER        12   \n",
       "1112    536527     22242        5 HOOK HANGER MAGIC TOADSTOOL        12   \n",
       "1113    536527     22244           3 HOOK HANGER MAGIC GARDEN        12   \n",
       "\n",
       "             InvoiceDate  UnitPrice  CustomerID  Country  \n",
       "1109 2010-12-01 13:04:00       2.95     12662.0  Germany  \n",
       "1110 2010-12-01 13:04:00       2.55     12662.0  Germany  \n",
       "1111 2010-12-01 13:04:00       0.85     12662.0  Germany  \n",
       "1112 2010-12-01 13:04:00       1.65     12662.0  Germany  \n",
       "1113 2010-12-01 13:04:00       1.95     12662.0  Germany  "
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cs_mba_ger.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import csv\n",
    "import pandas as pd\n",
    "grocery_items = set()\n",
    "with open(\"grocery_dataset.txt\") as f:\n",
    "    reader = csv.reader(f, delimiter=\",\")\n",
    "    for i, line in enumerate(reader):\n",
    "        grocery_items.update(line)\n",
    "output_list = list()\n",
    "with open(\"grocery_dataset.txt\") as f:\n",
    "    reader = csv.reader(f, delimiter=\",\")\n",
    "    for i, line in enumerate(reader):\n",
    "        row_val = {item:0 for item in grocery_items}\n",
    "        row_val.update({item:1 for item in line})\n",
    "        output_list.append(row_val)\n",
    "grocery_df = pd.DataFrame(output_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Instant food products</th>\n",
       "      <th>UHT-milk</th>\n",
       "      <th>abrasive cleaner</th>\n",
       "      <th>artif. sweetener</th>\n",
       "      <th>baby cosmetics</th>\n",
       "      <th>baby food</th>\n",
       "      <th>bags</th>\n",
       "      <th>baking powder</th>\n",
       "      <th>bathroom cleaner</th>\n",
       "      <th>beef</th>\n",
       "      <th>...</th>\n",
       "      <th>turkey</th>\n",
       "      <th>vinegar</th>\n",
       "      <th>waffles</th>\n",
       "      <th>whipped/sour cream</th>\n",
       "      <th>whisky</th>\n",
       "      <th>white bread</th>\n",
       "      <th>white wine</th>\n",
       "      <th>whole milk</th>\n",
       "      <th>yogurt</th>\n",
       "      <th>zwieback</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 169 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Instant food products  UHT-milk  abrasive cleaner  artif. sweetener  \\\n",
       "0                      0         0                 0                 0   \n",
       "1                      0         0                 0                 0   \n",
       "2                      0         0                 0                 0   \n",
       "3                      0         0                 0                 0   \n",
       "4                      0         0                 0                 0   \n",
       "\n",
       "   baby cosmetics  baby food  bags  baking powder  bathroom cleaner  beef  \\\n",
       "0               0          0     0              0                 0     0   \n",
       "1               0          0     0              0                 0     0   \n",
       "2               0          0     0              0                 0     0   \n",
       "3               0          0     0              0                 0     0   \n",
       "4               0          0     0              0                 0     0   \n",
       "\n",
       "     ...     turkey  vinegar  waffles  whipped/sour cream  whisky  \\\n",
       "0    ...          0        0        0                   0       0   \n",
       "1    ...          0        0        0                   0       0   \n",
       "2    ...          0        0        0                   0       0   \n",
       "3    ...          0        0        0                   0       0   \n",
       "4    ...          0        0        0                   0       0   \n",
       "\n",
       "   white bread  white wine  whole milk  yogurt  zwieback  \n",
       "0            0           0           0       0         0  \n",
       "1            0           0           0       1         0  \n",
       "2            0           0           1       0         0  \n",
       "3            0           0           0       1         0  \n",
       "4            0           0           1       0         0  \n",
       "\n",
       "[5 rows x 169 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grocery_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "43367\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>item_name</th>\n",
       "      <th>item_count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>whole milk</td>\n",
       "      <td>2513</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>other vegetables</td>\n",
       "      <td>1903</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>rolls/buns</td>\n",
       "      <td>1809</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>soda</td>\n",
       "      <td>1715</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>yogurt</td>\n",
       "      <td>1372</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          item_name  item_count\n",
       "0        whole milk        2513\n",
       "1  other vegetables        1903\n",
       "2        rolls/buns        1809\n",
       "3              soda        1715\n",
       "4            yogurt        1372"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "total_item_count = sum(grocery_df.sum())\n",
    "print(total_item_count)\n",
    "item_summary_df = grocery_df.sum().sort_values(ascending = False).reset_index().head(n=20)\n",
    "item_summary_df.rename(columns={item_summary_df.columns[0]:'item_name',item_summary_df.columns[1]:'item_count'}, inplace=True)\n",
    "item_summary_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "item_summary_df['item_perc'] = item_summary_df['item_count']/total_item_count\n",
    "item_summary_df['total_perc'] = item_summary_df.item_perc.cumsum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYEAAAD/CAYAAAAXBmohAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGGdJREFUeJzt3XuUXWWZ5/Hvk4SbcjGE6hgT7AANjRBIgFCgyAoMMyQN\nM9zGC7qWgEtMryUtdI/LITSzEF0TJ92DIGKTJi7k0g0CXkBGg81FUBgGQoGBABGJUEhFhBhtUJRI\nimf+2DvxWFTl7KpzUnWS/f2stdfZ5937fc97TlWd337fvc+pyEwkSfU0bqw7IEkaO4aAJNWYISBJ\nNWYISFKNGQKSVGOGgCTVmCEgSTVmCEhSjRkCklRjhoAk1diEse5AM7vttltOnz59rLshSVuUhx9+\n+JeZ2dVsv44PgenTp9PT0zPW3ZCkLUpEPFdlP6eDJKnGDAFJqjFDQJJqrOPPCUja8rz++uv09fXx\n2muvjXVXtnrbb78906ZNY5ttthlRfUNAUtv19fWx0047MX36dCJirLuz1cpM1q5dS19fH3vssceI\n2mg6HRQRu0fE3RHxZEQ8ERHnlOUXRsTqiFheLsc11DkvIlZFxFMRMbeh/JCIWFFu+1L42yFtlV57\n7TUmTZpkAGxmEcGkSZNaGnFVGQmsBz6VmY9ExE7AwxFxR7ntksy8aECn9gNOBfYH3gHcGRH7ZGY/\nsBj4OPAgsBSYB9w24t5L6lgGwOho9XVuOhLIzBcy85Fy/TfASmDqJqqcCNyQmesy81lgFdAdEVOA\nnTPzgSz+sfG1wEkt9V6S1JJhnROIiOnAQRRH8kcAn4yI04AeitHCrykC4oGGan1l2evl+sDyYZm+\n4Lub3N676PjhNilpM2v2dztcVf7O3/Oe93D//ffT29vL/fffz4c//OG29mE0LV++nJ///Occd9xx\nzXcepsqXiEbEjsA3gb/NzFcopnb2BGYBLwBfaFenImJ+RPRERM+aNWva1aykGrn//vsB6O3t5frr\nrx/j3rRm+fLlLF26dLO0XSkEImIbigC4LjO/BZCZL2Zmf2a+AXwF6C53Xw3s3lB9Wlm2ulwfWP4m\nmbkkM2dn5uyurqZffSFJb7LjjjsCsGDBAu69915mzZrFJZdcQn9/P5/+9Kc59NBDOfDAA7niiisA\nuOeee5gzZw4nnngie+65JwsWLOC6666ju7ubAw44gJ/+9KdDPtaLL77IySefzMyZM5k5c+bGALr4\n4ouZMWMGM2bM4Itf/CJQhNKMGTM21r3ooou48MILATjqqKM499xz6e7uZp999uHee+/lD3/4Axdc\ncAE33ngjs2bN4sYbb2zr69R0Oqi8gudKYGVmXtxQPiUzXyjvngw8Xq7fClwfERdTnBjeG1iWmf0R\n8UpEHE4xnXQacFn7nookvdmiRYu46KKL+M53vgPAkiVL2GWXXXjooYdYt24dRxxxBMceeywAjz76\nKCtXrmTXXXdlzz335Mwzz2TZsmVceumlXHbZZRvfyAc6++yzmTNnDjfffDP9/f389re/5eGHH+aq\nq67iwQcfJDM57LDDmDNnDhMnTtxkf9evX8+yZctYunQpn/3sZ7nzzjv53Oc+R09PD1/+8pfb++JQ\n7ZzAEcBHgBURsbws+3vgQxExC0igF/hrgMx8IiJuAp6kuLLorPLKIIBPAFcDO1BcFeSVQZJG1e23\n385jjz3GN77xDQBefvllnn76abbddlsOPfRQpkyZAsBee+21MRwOOOAA7r777iHb/P73v8+1114L\nwPjx49lll1247777OPnkk3nrW98KwCmnnMK9997LCSecsMn+nXLKKQAccsgh9Pb2tvRcq2gaApl5\nHzDYNUhDTlBl5kJg4SDlPcCMN9eQpNGRmVx22WXMnTv3T8rvuecetttuu433x40bt/H+uHHjWL9+\nfVsef8KECbzxxhsb7w+8xn/DY44fP75tj7kpfneQpK3aTjvtxG9+85uN9+fOncvixYt5/fXXAfjJ\nT37Cq6++2tJjHHPMMSxevBiA/v5+Xn75ZY488khuueUWfve73/Hqq69y8803c+SRRzJ58mReeukl\n1q5dy7p16zZOUw3nObSTXxshabMby0u3DzzwQMaPH8/MmTM544wzOOecc+jt7eXggw8mM+nq6uKW\nW25p6TEuvfRS5s+fz5VXXsn48eNZvHgx7373uznjjDPo7i6umTnzzDM56KCDALjgggvo7u5m6tSp\n7Lvvvk3bP/roo1m0aBGzZs3ivPPO44Mf/GBL/W0Uxee2Otfs2bOz8Z/K+DkBqfOtXLmSd73rXWPd\njdoY7PWOiIczc3azuk4HSVKNOR0kSRUtXLiQr3/9639S9v73v5/zzz9/jHrUOkNAkio6//zzt+g3\n/ME4HSRps+j0841bi1ZfZ0NAUtttv/32rF271iDYzDb8U5ntt99+xG04HSSp7aZNm0ZfXx9+AeTm\n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\n2dYAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x79c1f59dd8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "item_summary_df[['item_count']].head(n=20).plot.bar()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkgAAAIzCAYAAAD7++atAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xd8FNX+//H3hlQTkjVIEkINTRKaGgVyKaJEQlUB5aJ4\npYmoFCEqfrkqXXPhqiAKRK9KURFFBa/lApFqCSgIoqgUjRRpQkxCKCGQ8/uDB/NjJwFSdlPk9Xw8\n5vHInjl79jNDyL535syswxhjBAAAAItXWRcAAABQ3hCQAAAAbAhIAAAANgQkAAAAGwISAACADQEJ\nAADAhoAEAABgQ0ACAACwISABAADYEJAAlCtz586Vw+HQb7/9VtalqH///qpTp45Lm8Ph0Pjx4z3+\n2qtXr5bD4dDq1auttvbt26tJkyYef21J+u233+RwODR37txSeT2gvCEgAeXUuaCwYcMGq+3TTz8t\nlTdnuNeCBQs0ffr0si6jQOW5NqAseZd1AQAK79NPP9XMmTMJSWXoxIkT8vYu2p/OBQsW6IcfftDI\nkSML/Zx27drpxIkT8vX1LWqJRXKh2mrXrq0TJ07Ix8fHo68PlFcEJAAoAn9/f4+Of/LkSfn6+srL\ny8vjr3UxDoejTF8fKGucYgMqiP79+2vmzJmSzr55nVvOycvL0/Tp09W4cWP5+/srPDxcQ4YM0Z9/\n/ukyTp06ddStWzetXr1a119/vQICAtS0aVNrrssHH3ygpk2byt/fX7Gxsdq0adMla8vNzdWECRPU\noEED+fv7q0qVKmrTpo1SUlKsPlu2bFH//v1Vt25d+fv7KyIiQgMHDtSRI0cKtf3/+9//1LZtWwUG\nBqpy5crq2rWrtm7d6tLnwIEDGjBggGrUqCE/Pz9Vq1ZNt912W6HmMy1ZskRNmjSRv7+/mjRposWL\nFxfYzz4H6ejRoxo5cqTq1KkjPz8/hYWF6ZZbbtG3334r6ey8oU8++US7du2y/s3OzWs6N89o4cKF\nevLJJ1W9enVdccUVysrKKnAO0jkbN27U3/72NwUEBCgqKkrJycku6y80j8s+5sVqu9AcpJUrV1r/\nDk6nU7fddpt++uknlz7jx4+Xw+HQzp071b9/fzmdToWEhGjAgAE6fvz4hf8RgHKEI0hABTFkyBDt\n27dPKSkpeuONNwpcP3fuXA0YMEAjRoxQWlqaXnrpJW3atElffvmly6mSnTt36u6779aQIUN0zz33\n6Nlnn1X37t2VnJysf/7zn3rooYckSUlJSerdu7e2bdsmL68Lf54aP368kpKSdN9996lFixbKysrS\nhg0b9O233+qWW26RJKWkpOjXX3/VgAEDFBERoa1bt+qVV17R1q1btW7dOpewZ/fGG2+oX79+SkhI\n0JQpU3T8+HHNnj1bbdq00aZNm6w39V69emnr1q0aPny46tSpo0OHDiklJUW7d+/ON9n6fMuXL1ev\nXr0UExOjpKQkHTlyxApal/LAAw/ovffe07BhwxQTE6MjR47oiy++0E8//aTrrrtOTzzxhDIzM7V3\n715NmzZNkhQUFOQyxqRJk+Tr66tHH31UOTk5Fz2t9ueff6pLly7q3bu37rrrLr377rt68MEH5evr\nq4EDB16y3vMVprbzffbZZ+rcubPq1q2r8ePH68SJE3rxxRfVunVrffvtt/n2ce/evRUVFaWkpCR9\n++23evXVVxUWFqYpU6YUqU6gTBgA5dKcOXOMJPPNN99YbUOHDjUF/bf9/PPPjSTz1ltvubQvXbo0\nX3vt2rWNJPPVV19ZbcuWLTOSTEBAgNm1a5fV/vLLLxtJZtWqVRettXnz5qZr164X7XP8+PF8bW+/\n/baRZNauXWu1ndvutLQ0Y4wxR48eNU6n0wwePNjluQcOHDAhISFW+59//mkkmX//+98XraMg11xz\njalWrZrJyMiw2pYvX24kmdq1a7v0lWTGjRtnPQ4JCTFDhw696Phdu3bNN44xxqxatcpIMnXr1s23\nf86tO3/f33jjjUaSee6556y2nJwcc80115iwsDBz6tQpY0z+fXixMS9UW1pampFk5syZY7Wde50j\nR45Ybd99953x8vIy9957r9U2btw4I8kMHDjQZcwePXqYKlWq5HstoDziFBvwF7Bo0SKFhITolltu\n0eHDh60lNjZWQUFBWrVqlUv/mJgYxcXFWY9btmwpSbr55ptVq1atfO2//vrrRV/f6XRq69at2rFj\nxwX7BAQEWD+fPHlShw8fVqtWrSTJOh1VkJSUFGVkZOiuu+5y2bZKlSqpZcuW1rYFBATI19dXq1ev\nznda8WL279+vzZs3q1+/fgoJCbHab7nlFsXExFzy+U6nU+vXr9e+ffsK/Zp2/fr1c9k/F+Pt7a0h\nQ4ZYj319fTVkyBAdOnRIGzduLHYNl3JuP/Xv31+hoaFWe7NmzXTLLbfo008/zfecBx54wOVx27Zt\ndeTIEWVlZXmsTsBdCEjAX8COHTuUmZmpsLAwVa1a1WXJzs7WoUOHXPqfH4IkWcGgZs2aBbZfKnBM\nnDhRGRkZatiwoZo2barHHntMW7ZscemTnp6uhx9+WOHh4QoICFDVqlUVFRUlScrMzLzotklnw5t9\n25YvX25tm5+fn6ZMmaL//e9/Cg8PV7t27TR16lQdOHDgorXv2rVLktSgQYN8666++uqLPleSpk6d\nqh9++EE1a9ZUixYtNH78+EsGSrtz+6EwIiMjFRgY6NLWsGFDSfLovaPO7aeC9kl0dLQOHz6sY8eO\nubTbf8+uvPJKSZf+fQLKA+YgAX8BeXl5CgsL01tvvVXg+qpVq7o8rlSpUoH9LtRujLno67dr106/\n/PKLPvzwQy1fvlyvvvqqpk2bpuTkZN13332Szs5H+eqrr/TYY4/pmmuuUVBQkPLy8tSpUyfl5eVd\ndNuks/OQIiIi8q0//5L7kSNHqnv37lqyZImWLVump556SklJSVq5cqWuvfbai25DcfXu3Vtt27bV\n4sWLtXz5cv373//WlClT9MEHH6hz586FGqOwR48K60Lzuc6cOePW17mU4v4+AeUBAQmoQC70xlev\nXj199tlnat26tdvfbAsrNDRUAwYM0IABA5Sdna127dpp/Pjxuu+++/Tnn39qxYoVmjBhgsaOHWs9\n52Kn5M6pV6+eJCksLEzx8fGF6v/II4/okUce0Y4dO3TNNdfoueee05tvvllg/9q1a1+wlm3btl3y\n9SSpWrVqeuihh/TQQw/p0KFDuu666/T0009bAeliE9CLat++fTp27JjLUaTt27dLkjVJ+tyRmoyM\nDJfnnjsKdL7C1nZuPxW0T37++WddddVV+Y5sARUZp9iACuTcG5D9ja937946c+aMJk2alO85p0+f\nztff3eyX6gcFBal+/frKycmR9P+PJNiPHBTmDs4JCQkKDg7WM888o9zc3Hzr//jjD0nS8ePHdfLk\nSZd19erVU+XKla06ClKtWjVdc801mjdvnsupvpSUFP34448Xre3MmTP5Tg+GhYUpMjLS5TUDAwMv\nehqxKE6fPq2XX37Zenzq1Cm9/PLLqlq1qmJjYyX9/1C5du1al1pfeeWVfOMVtrbz99P5v08//PCD\nli9fri5duhR7m4DyiCNIQAVy7g1wxIgRSkhIUKVKldSnTx/deOONGjJkiJKSkrR582Z17NhRPj4+\n2rFjhxYtWqQXXnhBd9xxh8fqiomJUfv27RUbG6vQ0FBt2LDBuvRdkoKDg605Qbm5uapevbqWL1+u\ntLS0S44dHBys2bNn6x//+Ieuu+469enTR1WrVtXu3bv1ySefqHXr1nrppZe0fft2dejQQb1791ZM\nTIy8vb21ePFiHTx4UH369LnoayQlJalr165q06aNBg4cqPT0dL344otq3LixsrOzL/i8o0ePqkaN\nGrrjjjvUvHlzBQUF6bPPPtM333yj5557zuoXGxurd955R4mJibrhhhsUFBSk7t27F3LvuoqMjNSU\nKVP022+/qWHDhnrnnXe0efNmvfLKK9atHBo3bqxWrVppzJgxSk9PV2hoqBYuXKjTp0/nG68otf37\n3/9W586dFRcXp0GDBlmX+YeEhHB3d/z1lPFVdAAuoKDL/E+fPm2GDx9uqlatahwOR75L/l955RUT\nGxtrAgICTOXKlU3Tpk3N6NGjzb59+6w+tWvXLvCSfEn5Llc/d6n3pS6dnzx5smnRooVxOp0mICDA\nNGrUyDz99NPWZefGGLN3717To0cP43Q6TUhIiLnzzjvNvn378l02f7FL1BMSEkxISIjx9/c39erV\nM/379zcbNmwwxhhz+PBhM3ToUNOoUSMTGBhoQkJCTMuWLc2777570drPef/99010dLTx8/MzMTEx\n5oMPPjD9+vW76GX+OTk55rHHHjPNmzc3lStXNoGBgaZ58+Zm1qxZLs/Jzs42d999t3E6nS63Djh3\n2f2iRYvy1XOhy/wbN25sNmzYYOLi4oy/v7+pXbu2eemll/I9/5dffjHx8fHGz8/PhIeHm3/+858m\nJSUl35gXqq2gy/yNMeazzz4zrVu3NgEBASY4ONh0797d/Pjjjy59zl3m/8cff7i0X+jfFiiPHMYw\nWw4AAOB8zEECAACwISABAADYEJAAAABsCEgAAAA2BCQAAAAb7oNUSHl5edq3b58qV67s1rviAgAA\nzzHG6OjRo4qMjJSXV+GPCxGQCmnfvn35vsgTAABUDHv27FGNGjUK3Z+AVEiVK1eWdHYHBwcHl3E1\nAACgMLKyslSzZk3rfbywCEiFdO60WnBwMAEJAIAKpqjTY5ikDQAAYENAAgAAsCEgAQAA2BCQAAAA\nbAhIAAAANgQkAAAAGwISAACADQEJAADAhoAEAABgQ0ACAACwISABAADYEJAAAABsCEgAAAA2ZRqQ\nkpKSdMMNN6hy5coKCwvT7bffrm3btrn06d+/vxwOh8vSqVMnlz4nT57U0KFDVaVKFQUFBalXr146\nePCgS5/09HT17dtXwcHBcjqdGjRokLKzsz2+jQAAoOIp04C0Zs0aDR06VOvWrVNKSopyc3PVsWNH\nHTt2zKVfp06dtH//fmt5++23XdaPGjVKH330kRYtWqQ1a9Zo37596tmzp0ufvn37auvWrUpJSdHH\nH3+stWvX6v777/f4NgIAgIrHYYwxZV3EOX/88YfCwsK0Zs0atWvXTtLZI0gZGRlasmRJgc/JzMxU\n1apVtWDBAt1xxx2SpJ9//lnR0dFKTU1Vq1at9NNPPykmJkbffPONrr/+eknS0qVL1aVLF+3du1eR\nkZGXrC0rK0shISHKzMxUcHCwm7b4rGkp29021qhbGrptLAAAKrrivn+XqzlImZmZkqTQ0FCX9tWr\nVyssLExXX321HnzwQR05csRat3HjRuXm5io+Pt5qa9SokWrVqqXU1FRJUmpqqpxOpxWOJCk+Pl5e\nXl5av359gbXk5OQoKyvLZQEAAJeHchOQ8vLyNHLkSLVu3VpNmjSx2jt16qT58+drxYoVmjJlitas\nWaPOnTvrzJkzkqQDBw7I19dXTqfTZbzw8HAdOHDA6hMWFuay3tvbW6GhoVYfu6SkJIWEhFhLzZo1\n3bm5AACgHPMu6wLOGTp0qH744Qd98cUXLu19+vSxfm7atKmaNWumevXqafXq1erQoYPH6hkzZowS\nExOtx1lZWYQkAAAuE+XiCNKwYcP08ccfa9WqVapRo8ZF+9atW1dXXXWVdu7cKUmKiIjQqVOnlJGR\n4dLv4MGDioiIsPocOnTIZf3p06eVnp5u9bHz8/NTcHCwywIAAC4PZRqQjDEaNmyYFi9erJUrVyoq\nKuqSz9m7d6+OHDmiatWqSZJiY2Pl4+OjFStWWH22bdum3bt3Ky4uTpIUFxenjIwMbdy40eqzcuVK\n5eXlqWXLlm7eKgAAUNGV6Sm2oUOHasGCBfrwww9VuXJlaz5QSEiIAgIClJ2drQkTJqhXr16KiIjQ\nL7/8otGjR6t+/fpKSEiw+g4aNEiJiYkKDQ1VcHCwhg8frri4OLVq1UqSFB0drU6dOmnw4MFKTk5W\nbm6uhg0bpj59+hTqCjYAAHB5KdOANHv2bElS+/btXdrnzJmj/v37q1KlStqyZYvmzZunjIwMRUZG\n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\nKZd13377bbHHNcYU+AXER44cUWBgYLHHPX36tF5//XV99tlnio2NzTfW888/X+yxf/jhB7Vo0UKS\n9O6776pJkyb68ssvtXz5cj3wwAMaO3Zssce+0P747rvvFBoaWuxxJSktLU0xMTGSpPfff1/dunXT\nM888o2+//VZdunQp0dizZ8/W2LFjNXLkSD399NM6c+aMpLPfoTh9+nTddtttxR573LhxGjhwoGrX\nrl2iGu08ua8bNGigiRMn6ssvvyzw92/EiBElGn/p0qUKCgpSmzZtJJ09Gvif//xHMTExmjlzpq68\n8soij/mvf/1Ljz32mGbPnq0mTZqUqD47T+7rhx9+WNdff72+++47ValSxWrv0aOHBg8eXKKx77nn\nHhlj9Prrrys8PLxEX5Y+ffp06+cjR45o8uTJSkhIsL5yKzU1VcuWLdNTTz1Vopo9+fepVJVlOsOF\n5eTkmPj4ePO3v/3NBAUFWUd9Ssrf39/s3r3bGGPMP/7xD+sIx65du0xgYKBbXsMTnx5eeOEFExQU\nZIYNG2Z8fX3NkCFDTHx8vAkJCTH//Oc/izVmjx49TI8ePYyXl5fp0qWL9bhHjx7m1ltvNXXq1DEJ\nCQnFGtsYY9q3b3/B5aabbir2uMYYExgYaNLS0owxxnTv3t3861//Msac/Xf09/cv1pjnPl16eXnl\n+6QZHBxsvLy8zEMPPVSiuq+88kqzdetWY4wxrVu3Ni+//LIxxpi0tDQTEBBQorGjo6PN4sWLjTHG\nBAUFWZ/iv//+e1OlSpUSjd28eXNTqVIlc/PNN5u33nrLnDx5skTjlca+rlOnzgWXqKioEo1tjGeO\nBjqdTuPr62u8vLyMv7+/W45qlMa+Dg0NNT///LMxxvV3zx2/14GBgdbY7tSzZ88C31defPFFc9tt\nt5VobE/8fSoLHEEqJwqarzJ+/Hjddddduueee9SuXTurT7NmzYr9OjVr1lRqaqpCQ0O1dOlSLVy4\nUJL0559/yt/fv9jjns8Tnx5mzZqlV155RXfddZfmzp2r0aNHq27duho7dmyB87UK49y3OxtjVLly\nZQUEBFjrfH191apVqxJ9+lu1alWxn3spjRs3VnJysrp27aqUlBRNmjRJ0tk5D+d/gi2K6dOnyxij\ngQMHasKECS7ffu3r66s6deqU+Mud27Rpo8TERLVu3Vpff/213nnnHUnS9u3brSOOxZWWlqZrr702\nX7ufn5+OHTtWorE3b96sTZs2ac6cOXr44Yc1dOhQ9enTRwMHDtQNN9xQ5PFKY197eoK2J44Gnn+E\nw11KY1/n5eVZRyzPt3fvXlWuXLlEY99www3as2eP278Wa9myZZoyZUq+9k6dOun//u//SjS2J/4+\nlYmyzWc459z5ZIfDYS3nPy7uOWe7mTNnGm9vb+N0Ok2zZs3MmTNnjDHGzJgxw7Rv394dm+KRTw8B\nAQHWnJKqVauazZs3G2OM2b59uwkNDS12rXl5eaZ///7m6NGjxR7jUnbs2GGWLl1qjh8/br1mSa1a\ntco4nU7j5eVlBgwYYLWPGTPG9OjRo0Rjr1692pw6daqkJRZo165dpmvXrqZZs2bm1VdftdpHjhxp\nhg8fXqKxo6OjrblG53+KnzFjhrn22mtLNPb5Tp06Zd5//33TrVs34+PjY5o2bWqmT59uMjIyijyW\nJ/f1OTk5Oebnn382ubm5bh3Xk0cDPcGT+7p3795m8ODBxpizv3u//vqrOXr0qLn55ptLPLdu586d\nJj4+3sydO9ds2LDBfPfddy5LcdWqVcs8++yz+dqfffZZU6tWrZKU7NG/T6WJgFRO/Pbbb4VeSuqb\nb74xH3zwgUso+Pjjj80XX3xR4rGNMaZFixbm8ccfN2vXrjX+/v5WmElNTTXVq1cv1phRUVHm22+/\nNcYYExsba5KTk40xxixbtqxEEwrPnDljfHx8zPbt24s9xoUcPnzY3HzzzVawPfeGPWDAAJOYmFji\n8U+fPm3S09Nd2tLS0gqciHopmZmZLj9fbCmv/vOf/5jq1aubhQsXmsDAQPP222+byZMnWz+7S05O\njlm4cKHp2LGj8fb2Nu3atTP169c3lStXNgsXLrzk80trXx87dswMHDjQVKpUyWXi8LBhw0xSUlKJ\nxjbGmG7dupmEhAQzceJE4+PjY/bu3WuMOft/skGDBsUed+fOneaJJ54wffr0sX6XP/30U/PDDz8U\neazS2td79uwxMTExJjo62nh7e5tWrVqZKlWqmKuvvrpY/x/Pl5qaaqKiogr88FySD8xz5swxlSpV\nMt26dTOTJk0ykyZNMt26dTPe3t5mzpw5JarZGPf+fSorBKTLlKc+VRrjmU8PgwYNMuPHjzfGGPPS\nSy+ZgIAAEx8fb5xOpxk4cGCJ6vXUlTP/+Mc/TEJCgtmzZ4/LEY2lS5eamJiYEo+fm5trUlJSTHJy\nsnXF4++//16so2HnX+Fz7g+vfXHHEcwLvTllZWWZnJycEo1tjDFvvvmmqV+/vvVGUr16dZcjVSWx\nYcMGM3ToUBMaGmqqVatmHn/8cbNjxw5r/YwZM0xYWNglxymtfT1ixAgTGxtrPv/8cxMYGGj9/i1Z\nssRcc801JRrbmLNHA7t16+bWo4GrV6+2/m/7+vpaNSclJZlevXoVebzS2tfGnP3/+Oabb5rHHnvM\nPPjgg+Y///mPddS4JKKjo03Pnj3NunXrTFpamls/MK9bt87cfffd5tprrzXXXnutufvuu826detK\nXPNfhcMYY8r6NB+k//73v4Xue+uttxb7dY4fP67hw4dr3rx5ks7O/ahbt66GDx+u6tWrl/jc8zln\nzpxRVlaWy5Usv/32m6644gqFhYUVeby8vDzl5eXJ2/vstLmFCxfqq6++UoMGDTRkyBD5+voWu9aP\nPvpIU6dOdfuVMxEREVq2bJmaN2+uypUr67vvvlPdunX166+/qlmzZiW6P8quXbvUqVMn7d69Wzk5\nOda/48MPP6ycnBwlJycXabw1a9aodevW8vb21po1ay7a98Ybbyx23V5eXhe9CqdGjRrq37+/xo0b\nJy+v4t+m7fjx48rOzi7W71pBmjZtqp9//lkdO3bU4MGD1b17d1WqVMmlz+HDhxUWFqa8vLyLjlVa\n+7p27dp655131KpVK5ffv507d+q6664r0T10Tp8+rQULFqhjx46KiIgo9jh2cXFxuvPOO5WYmOhS\n89dff62ePXte9Ca6BSmtfe1JgYGB+u6771S/fv2yLqXQrr322gL/nzscDvn7+6t+/frq37+/brrp\npjKorgjKOqHhrPMPn15sKe+fKisiT1w5Y8zZuQjnTt2dfwTpm2++KdG8KWOMue2228w999xjcnJy\nXMZetWqVqV+/fonG9qT58+ebGjVqmCeffNL897//Nf/973/Nk08+aWrWrGmSk5PN5MmTjdPpNE8/\n/XRZl+pi4sSJ1imkiiIgIMD6vTj/d2Tz5s0mODjYLeO745T/+QIDA82vv/5qjMl/NZifn59bX8ud\nnnnmGfP666/na3/ttdesOZjF1a1bN4/fo+7EiRNuPeU4ZswYExISYtq0aWMSExNNYmKiadu2rQkJ\nCTEPP/ywueWWW4yXl1e5vT/ZOVzFVk5c6lOnuyxZssT6VHl+wm/cuLF++eUXt7zGwYMH9eijj2rF\nihU6dOiQjO0gZUFXexSkKHeiLsmVfZ64ckaS2rZtq/nz51tXcDgcDuXl5Wnq1Kkl/uT0+eef66uv\nvsp35KxOnTr6/fffSzT2pe4e3q5du2KP/cYbb+i5555T7969rbbu3buradOmevnll7VixQrVqlVL\nTz/9tP75z38WaWxPfWrNzc3V3Llzdccdd6h69epFeu6leHJfX3/99frkk080fPhwSbL2zauvvlri\nq7YkqUWLFtq0aZNb7w3ldDq1f/9+RUVFubRv2rSpxPvek/v65Zdftq7IPF/jxo3Vp08fPf7448Ue\nu3v37ho1apS+//57NW3aVD4+Pi7ri3tG4fjx4xo9erTeffddHTlyJN/6wv6dLkh6eroeeeSRfPdT\nmjx5snbt2qXly5dr3LhxmjRpUonuT+ZxZZ3QULo8/anSGGM6depkYmJizKxZs8zixYvNkiVLXJbC\nsk9GvNhSHn3//fcmLCzMdOrUyfj6+po77rjDREdHm/DwcLNz584Sje10Oq0riM7/d/z8888LNQ/m\nYi505NId+zogIKDACfHbt2+3rnz69ddfi3UVlCc/tUZGRpoff/yxyM+7FE/u688//9wEBQWZBx54\nwPj7+1v7IDAw0GzYsKHEtb/zzjumbt265sUXXzRfffWVW66ueuSRR0ybNm3M/v37TeXKlc2OHTvM\nF198YerWrWvNQSwuT+5rPz8/68jX+X755ZcSH/ny1BmFhx56yERHR5v33nvPBAQEmNdff91MmjTJ\n1KhRw7z55pslqjkkJMRlft45O3bssN5nfvrpJxMUFFSi1/E0AlI58cILL5gTJ05YP19sKYm2bdua\nGTNmGGP+/+Woxpy9sqUkN0U8X1BQkNm0aVOJxzl/IuLixYtNvXr1THJysvUHODk52TRo0MC6OWBx\n7dq166JLSWRkZJjJkyebO++803Tu3Nk88cQTZt++fSUa0xjPXlackZHhsvzxxx9m+fLlpmXLluaz\nzz4r0dgNGjQo8OtXHn/8cdOwYUNjzNlTkJGRkUUee8iQIWbixIn52idNmmTuu+8+Y4wxY8eONbGx\nsUUe++mnnzb9+vVz+0UNntzXxpy9Iuy+++4zN9xwg4mOjjZ9+/Y1W7ZscUPlFw4cJXnjzsnJMffd\nd5/x9vY2DofD+Pj4GC8vL3PPPfeY06dPl6heT+7r+vXrmzfeeCNf+/z5891yU05PqFmzplm1apUx\n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\nz7mhe3t7Iz8/v9Zu6HWRsPHx40e0adMGp06dQtu2bcWqnZSUhISEBLRp00YseleuXKnx5++aet3g\nk1IjCgoKnzWlU1BQ4KRdUVFB/v7+pKyszMTFKCoq1uheWxsmTpz4zY//Cj169KC+ffvS48ePmbbH\njx+To6Mj9ezZk7N+dHQ09enThxo3bkxKSkpka2srFjNONTU1pj5YdW7dukUqKiqctPX09Jh6Y+Im\nPj6eLl++TERERUVF1K9fP1JVVaWOHTs2yDqAHz58oN69e0vMhNTGxobCwsKISDhOzdfXl7p37y6R\nPrnWGqxem676mM+fP0/NmjXjpC0pN3RJ07RpU7p3757YdTt16lSj07o4qIuan3WBdILUAGnWrBkd\nPHhQpP3AgQPUvHlzsfTx/v17unv3LsXFxdGbN2/EoilFGEn70EiK//3vfzRixAgqLy9n2srLy+mn\nn37iHGSvpaXFulzO1/jUwT03N5dWr17N+Dg1RKp7TombY8eOkbq6OgUEBBCfz6dVq1bRlClTSF5e\nns6fP89ZPyAgQKio6fDhw4nH41HTpk0ZV+na4ubmRkOHDqUPHz4wfkIPHjwga2tr8vLy4jReSbuh\np6enk4eHB/Xu3Zt69+5NHh4eNZYIqS3Lli0jV1dX+vjxI2et6ly6dIm6du1KV65coWfPngmVn6ru\nAccGGRkZKioqEml/+vQpycrKctKuS6Rp/g0QPz8/BAUFwcfHh3Ecjo2NxZ9//ok5c+Zw2gqTUreQ\nBH1oJMW9e/fQs2dPaGhooEePHgAqvbOKi4tx+fJlTttVCxYsgIqKikTOYUdHRyEH9zZt2kBOTq5B\nO7h7e3tDQUHhmwu71parV6/Cz89PKPV88eLFcHR05KxtbGyMPXv2oFu3brhw4QJGjhyJAwcO4ODB\ng8jPz8f58+drrfn69WsMHz6csZpo2rQpHj9+jK5du+LMmTNQVlZmPV5PT0/IycmJBAjPnTsXb9++\nxfr161lrHz58GKNHj0anTp2EiuzGx8dj//79+Omnn1hrDxs2DJcuXYKKigratWsncgzYhixUxet9\nei0ilkHaAFBcXAwigqamJjIzMxmvMwAQCAQ4efIkfHx88OjRI1ZjrmukE6QGCBEhODgYgYGBzInU\ntGlTzJs3D7NmzeL05Tps2LAa/756NXUXF5dalwqwtrb+5nHdvn27Vtr/BsTtQ6OpqfnV93HixIki\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x79c1e2a7b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt; plt.rcdefaults()\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    " \n",
    "objects = (list(item_summary_df['item_name'].head(n=20)))\n",
    "y_pos = np.arange(len(objects))\n",
    "performance = list(item_summary_df['item_count'].head(n=20))\n",
    " \n",
    "plt.bar(y_pos, performance, align='center', alpha=0.5)\n",
    "plt.xticks(y_pos, objects, rotation='vertical')\n",
    "plt.ylabel('Item count')\n",
    "plt.title('Item sales distribution')\n",
    " \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import Orange\n",
    "data = Orange.data.Table(\"lenses\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 2.,  1.,  0.,  1.],\n",
       "       [ 2.,  1.,  0.,  0.],\n",
       "       [ 2.,  1.,  1.,  1.],\n",
       "       [ 2.,  1.,  1.,  0.],\n",
       "       [ 2.,  0.,  0.,  1.],\n",
       "       [ 2.,  0.,  0.,  0.],\n",
       "       [ 2.,  0.,  1.,  1.],\n",
       "       [ 2.,  0.,  1.,  0.],\n",
       "       [ 0.,  1.,  0.,  1.],\n",
       "       [ 0.,  1.,  0.,  0.],\n",
       "       [ 0.,  1.,  1.,  1.],\n",
       "       [ 0.,  1.,  1.,  0.],\n",
       "       [ 0.,  0.,  0.,  1.],\n",
       "       [ 0.,  0.,  0.,  0.],\n",
       "       [ 0.,  0.,  1.,  1.],\n",
       "       [ 0.,  0.,  1.,  0.],\n",
       "       [ 1.,  1.,  0.,  1.],\n",
       "       [ 1.,  1.,  0.,  0.],\n",
       "       [ 1.,  1.,  1.,  1.],\n",
       "       [ 1.,  1.,  1.,  0.],\n",
       "       [ 1.,  0.,  0.,  1.],\n",
       "       [ 1.,  0.,  0.,  0.],\n",
       "       [ 1.,  0.,  1.,  1.],\n",
       "       [ 1.,  0.,  1.,  0.]])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "#input_df = grocery_df\n",
    "def prune_dataset(input_df, length_trans = 2, total_sales_perc = 0.5, start_item = None, end_item = None):\n",
    "    if 'total_items' in input_df.columns:\n",
    "        del(input_df['total_items'])\n",
    "    item_count = input_df.sum().sort_values(ascending = False).reset_index()\n",
    "    total_items = sum(input_df.sum().sort_values(ascending = False))\n",
    "    item_count.rename(columns={item_count.columns[0]:'item_name',item_count.columns[1]:'item_count'}, inplace=True)\n",
    "    if not start_item and not end_item: \n",
    "        item_count['item_perc'] = item_count['item_count']/total_items\n",
    "        item_count['total_perc'] = item_count.item_perc.cumsum()\n",
    "        selected_items = list(item_count[item_count.total_perc < total_sales_perc].item_name)\n",
    "        input_df['total_items'] = input_df[selected_items].sum(axis = 1)\n",
    "        input_df = input_df[input_df.total_items >= length_trans]\n",
    "        del(input_df['total_items'])\n",
    "        return input_df[selected_items], item_count[item_count.total_perc < total_sales_perc]\n",
    "    elif end_item > start_item:\n",
    "        selected_items = list(item_count[start_item:end_item].item_name)\n",
    "        input_df['total_items'] = input_df[selected_items].sum(axis = 1)\n",
    "        input_df = input_df[input_df.total_items >= length_trans]\n",
    "        del(input_df['total_items'])\n",
    "        return input_df[selected_items],item_count[start_item:end_item]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(4585, 13)\n"
     ]
    }
   ],
   "source": [
    "output_df, item_counts = prune_dataset(input_df=grocery_df, length_trans=2,total_sales_perc=0.4)\n",
    "print(output_df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1607, 7)\n"
     ]
    }
   ],
   "source": [
    "output_df_n, item_counts_n = prune_dataset(grocery_df, length_trans = 2,start_item = 5, end_item = 12)\n",
    "print(output_df_n.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "input_ass_rules = output_df\n",
    "from Orange.data import Domain, DiscreteVariable, ContinuousVariable\n",
    "from orangecontrib.associate.fpgrowth import *\n",
    "domain_grocery = Domain([DiscreteVariable.make(name=item,values=['0', '1']) for item in input_ass_rules.columns])\n",
    "data_gro_1 = Orange.data.Table.from_numpy(domain=domain_grocery,  X=input_ass_rules.as_matrix(),Y= None)\n",
    "data_gro_1_en, mapping = OneHot.encode(data_gro_1, include_class=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0: (0, 0),\n",
       " 1: (0, 1),\n",
       " 2: (1, 0),\n",
       " 3: (1, 1),\n",
       " 4: (2, 0),\n",
       " 5: (2, 1),\n",
       " 6: (3, 0),\n",
       " 7: (3, 1),\n",
       " 8: (4, 0),\n",
       " 9: (4, 1),\n",
       " 10: (5, 0),\n",
       " 11: (5, 1),\n",
       " 12: (6, 0),\n",
       " 13: (6, 1),\n",
       " 14: (7, 0),\n",
       " 15: (7, 1),\n",
       " 16: (8, 0),\n",
       " 17: (8, 1),\n",
       " 18: (9, 0),\n",
       " 19: (9, 1),\n",
       " 20: (10, 0),\n",
       " 21: (10, 1),\n",
       " 22: (11, 0),\n",
       " 23: (11, 1),\n",
       " 24: (12, 0),\n",
       " 25: (12, 1)}"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mapping"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of required transactions =  45\n"
     ]
    }
   ],
   "source": [
    "support = 0.01\n",
    "print(\"num of required transactions = \", int(input_ass_rules.shape[0]*support))\n",
    "num_trans = input_ass_rules.shape[0]*support\n",
    "itemsets = dict(frequent_itemsets(data_gro_1_en, support))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "166886"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(itemsets)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Raw rules data frame of 16628 rules generated\n"
     ]
    }
   ],
   "source": [
    "confidence = 0.3\n",
    "rules_df = pd.DataFrame()\n",
    "if len(itemsets) < 1000000: \n",
    "    rules = [(P, Q, supp, conf)\n",
    "    for P, Q, supp, conf in association_rules(itemsets, confidence)\n",
    "       if len(Q) == 1 ]\n",
    "\n",
    "    names = {item: '{}={}'.format(var.name, val)\n",
    "        for item, var, val in OneHot.decode(mapping, data_gro_1, mapping)}\n",
    "    \n",
    "    eligible_ante = [v for k,v in names.items() if v.endswith(\"1\")]\n",
    "    \n",
    "    N = input_ass_rules.shape[0]\n",
    "    \n",
    "    rule_stats = list(rules_stats(rules, itemsets, N))\n",
    "    \n",
    "    rule_list_df = []\n",
    "    for ex_rule_frm_rule_stat in rule_stats:\n",
    "        ante = ex_rule_frm_rule_stat[0]            \n",
    "        cons = ex_rule_frm_rule_stat[1]\n",
    "        named_cons = names[next(iter(cons))]\n",
    "        if named_cons in eligible_ante:\n",
    "            rule_lhs = [names[i][:-2] for i in ante if names[i] in eligible_ante]\n",
    "            ante_rule = ', '.join(rule_lhs)\n",
    "            if ante_rule and len(rule_lhs)>1 :\n",
    "                rule_dict = {'support' : ex_rule_frm_rule_stat[2],\n",
    "                     'confidence' : ex_rule_frm_rule_stat[3],\n",
    "                    'coverage' : ex_rule_frm_rule_stat[4],\n",
    "                     'strength' : ex_rule_frm_rule_stat[5],\n",
    "                     'lift' : ex_rule_frm_rule_stat[6],\n",
    "                    'leverage' : ex_rule_frm_rule_stat[7],\n",
    "                    'antecedent': ante_rule,\n",
    "                    'consequent':named_cons[:-2] }\n",
    "                rule_list_df.append(rule_dict)\n",
    "    rules_df = pd.DataFrame(rule_list_df)\n",
    "    print(\"Raw rules data frame of {} rules generated\".format(rules_df.shape[0]))\n",
    "    if not rules_df.empty:\n",
    "        pruned_rules_df = rules_df.groupby(['antecedent','consequent']).max().reset_index()\n",
    "    else:\n",
    "        print(\"Unable to generate any rule\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>consequent</th>\n",
       "      <th>antecedent</th>\n",
       "      <th>support</th>\n",
       "      <th>confidence</th>\n",
       "      <th>lift</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>root vegetables</td>\n",
       "      <td>yogurt, whole milk, tropical fruit</td>\n",
       "      <td>228</td>\n",
       "      <td>0.463636</td>\n",
       "      <td>2.230611</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>sausage</td>\n",
       "      <td>shopping bags, rolls/buns</td>\n",
       "      <td>59</td>\n",
       "      <td>0.393162</td>\n",
       "      <td>2.201037</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>tropical fruit</td>\n",
       "      <td>yogurt, root vegetables, whole milk</td>\n",
       "      <td>92</td>\n",
       "      <td>0.429907</td>\n",
       "      <td>2.156588</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>citrus fruit</td>\n",
       "      <td>whole milk, other vegetables, tropical fruit</td>\n",
       "      <td>66</td>\n",
       "      <td>0.333333</td>\n",
       "      <td>2.125637</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>yogurt</td>\n",
       "      <td>whole milk, tropical fruit</td>\n",
       "      <td>199</td>\n",
       "      <td>0.484211</td>\n",
       "      <td>1.891061</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>other vegetables</td>\n",
       "      <td>yogurt, whole milk, tropical fruit</td>\n",
       "      <td>228</td>\n",
       "      <td>0.643836</td>\n",
       "      <td>1.826724</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>shopping bags</td>\n",
       "      <td>sausage, soda</td>\n",
       "      <td>50</td>\n",
       "      <td>0.304878</td>\n",
       "      <td>1.782992</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>bottled water</td>\n",
       "      <td>yogurt, soda</td>\n",
       "      <td>59</td>\n",
       "      <td>0.333333</td>\n",
       "      <td>1.707635</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>whole milk</td>\n",
       "      <td>yogurt, tropical fruit</td>\n",
       "      <td>228</td>\n",
       "      <td>0.754098</td>\n",
       "      <td>1.703222</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>rolls/buns</td>\n",
       "      <td>yogurt, whole milk, tropical fruit</td>\n",
       "      <td>97</td>\n",
       "      <td>0.522222</td>\n",
       "      <td>1.679095</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>soda</td>\n",
       "      <td>yogurt, sausage</td>\n",
       "      <td>95</td>\n",
       "      <td>0.390625</td>\n",
       "      <td>1.398139</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          consequent                                    antecedent  support  \\\n",
       "4    root vegetables            yogurt, whole milk, tropical fruit      228   \n",
       "5            sausage                     shopping bags, rolls/buns       59   \n",
       "8     tropical fruit           yogurt, root vegetables, whole milk       92   \n",
       "1       citrus fruit  whole milk, other vegetables, tropical fruit       66   \n",
       "10            yogurt                    whole milk, tropical fruit      199   \n",
       "2   other vegetables            yogurt, whole milk, tropical fruit      228   \n",
       "6      shopping bags                                 sausage, soda       50   \n",
       "0      bottled water                                  yogurt, soda       59   \n",
       "9         whole milk                        yogurt, tropical fruit      228   \n",
       "3         rolls/buns            yogurt, whole milk, tropical fruit       97   \n",
       "7               soda                               yogurt, sausage       95   \n",
       "\n",
       "    confidence      lift  \n",
       "4     0.463636  2.230611  \n",
       "5     0.393162  2.201037  \n",
       "8     0.429907  2.156588  \n",
       "1     0.333333  2.125637  \n",
       "10    0.484211  1.891061  \n",
       "2     0.643836  1.826724  \n",
       "6     0.304878  1.782992  \n",
       "0     0.333333  1.707635  \n",
       "9     0.754098  1.703222  \n",
       "3     0.522222  1.679095  \n",
       "7     0.390625  1.398139  "
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pruned_rules_df[['antecedent','consequent','support','confidence','lift']].groupby('consequent').max().reset_index().sort_values('lift',ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "old_rules_df = pruned_rules_df[['antecedent','consequent','support','confidence','lift']].sort_values(['lift', 'support','confidence'], ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 273,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "visited_rules = set()\n",
    "for ante, cons, supp, conf in rules:\n",
    "    if names[next(iter(cons))] == eligible_ante[0]:\n",
    "        rule_lhs = [names[i][:-2] for i in ante if names[i] in eligible_ante]\n",
    "        ante_rule = ', '.join(rule_lhs)\n",
    "        if ante_rule and len(rule_lhs)>1 and ante_rule not in visited_rules:\n",
    "            print(ante_rule, '-->',\n",
    "              names[next(iter(cons))][:-2],\n",
    "              '(supp: {}, conf: {})'.format(supp, conf))\n",
    "        # By sales percentage\n",
    "\n",
    "total_sales_perc = 0.5\n",
    "item_count = grocery_df.sum().sort_values(ascending = False).reset_index()\n",
    "total_items = sum(grocery_df.sum().sort_values(ascending = False))\n",
    "item_count.rename(columns={item_count.columns[0]:'item_name',item_count.columns[1]:'item_count'}, inplace=True)\n",
    "item_count['item_perc'] = item_count['item_count']/total_items\n",
    "item_count['total_perc'] = item_count.item_perc.cumsum()\n",
    "selected_items = list(item_count[item_count.total_perc < total_sales_perc].item_name)\n",
    "print(len(selected_items))\n",
    "selected_items\n",
    "        visited_rules.add(ante_rule)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>item_name</th>\n",
       "      <th>item_count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>WHITE HANGING HEART T-LIGHT HOLDER</td>\n",
       "      <td>2166</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>JUMBO BAG RED RETROSPOT</td>\n",
       "      <td>1938</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>REGENCY CAKESTAND 3 TIER</td>\n",
       "      <td>1685</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>PARTY BUNTING</td>\n",
       "      <td>1594</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>LUNCH BAG RED RETROSPOT</td>\n",
       "      <td>1392</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>ASSORTED COLOUR BIRD ORNAMENT</td>\n",
       "      <td>1371</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>SET OF 3 CAKE TINS PANTRY DESIGN</td>\n",
       "      <td>1241</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>NATURAL SLATE HEART CHALKBOARD</td>\n",
       "      <td>1219</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>LUNCH BAG  BLACK SKULL.</td>\n",
       "      <td>1216</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>HEART OF WICKER SMALL</td>\n",
       "      <td>1164</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>JUMBO BAG PINK POLKADOT</td>\n",
       "      <td>1159</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>JUMBO SHOPPER VINTAGE RED PAISLEY</td>\n",
       "      <td>1133</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>JUMBO STORAGE BAG SUKI</td>\n",
       "      <td>1130</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>PACK OF 72 RETROSPOT CAKE CASES</td>\n",
       "      <td>1129</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>PAPER CHAIN KIT 50'S CHRISTMAS</td>\n",
       "      <td>1125</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                             item_name  item_count\n",
       "0   WHITE HANGING HEART T-LIGHT HOLDER        2166\n",
       "1              JUMBO BAG RED RETROSPOT        1938\n",
       "2             REGENCY CAKESTAND 3 TIER        1685\n",
       "3                        PARTY BUNTING        1594\n",
       "4              LUNCH BAG RED RETROSPOT        1392\n",
       "5        ASSORTED COLOUR BIRD ORNAMENT        1371\n",
       "6    SET OF 3 CAKE TINS PANTRY DESIGN         1241\n",
       "7      NATURAL SLATE HEART CHALKBOARD         1219\n",
       "8              LUNCH BAG  BLACK SKULL.        1216\n",
       "9                HEART OF WICKER SMALL        1164\n",
       "10             JUMBO BAG PINK POLKADOT        1159\n",
       "11   JUMBO SHOPPER VINTAGE RED PAISLEY        1133\n",
       "12              JUMBO STORAGE BAG SUKI        1130\n",
       "13     PACK OF 72 RETROSPOT CAKE CASES        1129\n",
       "14     PAPER CHAIN KIT 50'S CHRISTMAS         1125"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "item_counts_n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "items = list(cs_mba_uk.Description.unique())\n",
    "grouped = cs_mba_uk.groupby('InvoiceNo')\n",
    "transaction_level_df_uk = grouped.aggregate(lambda x: tuple(x)).reset_index()[['InvoiceNo','Description']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "transaction_dict = {item:0 for item in items}\n",
    "output_dict = dict()\n",
    "temp = dict()\n",
    "for rec in transaction_level_df_uk.to_dict('records'):\n",
    "    invoice_num = rec['InvoiceNo']\n",
    "    items_list = rec['Description']\n",
    "    transaction_dict = {item:0 for item in items}\n",
    "    transaction_dict.update({item:1 for item in items if item in items_list})\n",
    "    temp.update({invoice_num:transaction_dict})\n",
    "\n",
    "new = [v for k,v in temp.items()]\n",
    "tranasction_df = pd.DataFrame(new)\n",
    "del(tranasction_df[tranasction_df.columns[0]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(18786, 4058)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tranasction_df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(8586, 43)\n"
     ]
    }
   ],
   "source": [
    "output_df_uk, item_counts = prune_dataset(input_df=tranasction_df, length_trans=2,total_sales_perc=0.1)\n",
    "print(output_df_uk.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(3711, 10)\n"
     ]
    }
   ],
   "source": [
    "output_df_uk_n, item_counts_n = prune_dataset(input_df=tranasction_df, length_trans = 2,start_item = 0, end_item = 10)\n",
    "print(output_df_uk_n.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>item_name</th>\n",
       "      <th>item_count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>WHITE HANGING HEART T-LIGHT HOLDER</td>\n",
       "      <td>2166</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>JUMBO BAG RED RETROSPOT</td>\n",
       "      <td>1938</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>REGENCY CAKESTAND 3 TIER</td>\n",
       "      <td>1685</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>PARTY BUNTING</td>\n",
       "      <td>1594</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>LUNCH BAG RED RETROSPOT</td>\n",
       "      <td>1392</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>ASSORTED COLOUR BIRD ORNAMENT</td>\n",
       "      <td>1371</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>SET OF 3 CAKE TINS PANTRY DESIGN</td>\n",
       "      <td>1241</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>NATURAL SLATE HEART CHALKBOARD</td>\n",
       "      <td>1219</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>LUNCH BAG  BLACK SKULL.</td>\n",
       "      <td>1216</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>HEART OF WICKER SMALL</td>\n",
       "      <td>1164</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                            item_name  item_count\n",
       "0  WHITE HANGING HEART T-LIGHT HOLDER        2166\n",
       "1             JUMBO BAG RED RETROSPOT        1938\n",
       "2            REGENCY CAKESTAND 3 TIER        1685\n",
       "3                       PARTY BUNTING        1594\n",
       "4             LUNCH BAG RED RETROSPOT        1392\n",
       "5       ASSORTED COLOUR BIRD ORNAMENT        1371\n",
       "6   SET OF 3 CAKE TINS PANTRY DESIGN         1241\n",
       "7     NATURAL SLATE HEART CHALKBOARD         1219\n",
       "8             LUNCH BAG  BLACK SKULL.        1216\n",
       "9               HEART OF WICKER SMALL        1164"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "item_counts_n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 623,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>WHITE HANGING HEART T-LIGHT HOLDER</th>\n",
       "      <th>JUMBO BAG RED RETROSPOT</th>\n",
       "      <th>REGENCY CAKESTAND 3 TIER</th>\n",
       "      <th>PARTY BUNTING</th>\n",
       "      <th>LUNCH BAG RED RETROSPOT</th>\n",
       "      <th>ASSORTED COLOUR BIRD ORNAMENT</th>\n",
       "      <th>SET OF 3 CAKE TINS PANTRY DESIGN</th>\n",
       "      <th>NATURAL SLATE HEART CHALKBOARD</th>\n",
       "      <th>LUNCH BAG  BLACK SKULL.</th>\n",
       "      <th>HEART OF WICKER SMALL</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    WHITE HANGING HEART T-LIGHT HOLDER  JUMBO BAG RED RETROSPOT  \\\n",
       "3                                    1                        0   \n",
       "5                                    0                        0   \n",
       "8                                    0                        0   \n",
       "16                                   0                        1   \n",
       "18                                   0                        0   \n",
       "\n",
       "    REGENCY CAKESTAND 3 TIER  PARTY BUNTING  LUNCH BAG RED RETROSPOT  \\\n",
       "3                          1              0                        1   \n",
       "5                          0              0                        0   \n",
       "8                          0              1                        0   \n",
       "16                         1              1                        0   \n",
       "18                         1              1                        0   \n",
       "\n",
       "    ASSORTED COLOUR BIRD ORNAMENT  SET OF 3 CAKE TINS PANTRY DESIGN   \\\n",
       "3                               0                                  1   \n",
       "5                               1                                  0   \n",
       "8                               1                                  1   \n",
       "16                              0                                  0   \n",
       "18                              0                                  0   \n",
       "\n",
       "    NATURAL SLATE HEART CHALKBOARD   LUNCH BAG  BLACK SKULL.  \\\n",
       "3                                 0                        0   \n",
       "5                                 0                        0   \n",
       "8                                 0                        0   \n",
       "16                                0                        0   \n",
       "18                                0                        0   \n",
       "\n",
       "    HEART OF WICKER SMALL  \n",
       "3                       0  \n",
       "5                       1  \n",
       "8                       0  \n",
       "16                      1  \n",
       "18                      0  "
      ]
     },
     "execution_count": 623,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "output_df_uk_n.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "input_ass_rules = output_df_uk_n\n",
    "\n",
    "domain_grocery = Domain([DiscreteVariable.make(name=item,values=['0', '1']) for item in input_ass_rules.columns])\n",
    "data_gro_1 = Orange.data.Table.from_numpy(domain=domain_grocery,  X=input_ass_rules.as_matrix(),Y= None)\n",
    "data_gro_1_en, mapping = OneHot.encode(data_gro_1, include_class=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of required transactions =  33\n"
     ]
    }
   ],
   "source": [
    "support = 0.009\n",
    "print(\"num of required transactions = \", int(input_ass_rules.shape[0]*support))\n",
    "num_trans = input_ass_rules.shape[0]*support\n",
    "itemsets = dict(frequent_itemsets(data_gro_1_en, support))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "19178"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(itemsets)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Raw rules data frame of 2607 rules generated\n"
     ]
    }
   ],
   "source": [
    "confidence = 0.4\n",
    "rules_df = pd.DataFrame()\n",
    "if len(itemsets) < 1000000: \n",
    "    rules = [(P, Q, supp, conf)\n",
    "    for P, Q, supp, conf in association_rules(itemsets, confidence)\n",
    "       if len(Q) == 1 ]\n",
    "\n",
    "    names = {item: '{}={}'.format(var.name, val)\n",
    "        for item, var, val in OneHot.decode(mapping, data_gro_1, mapping)}\n",
    "    \n",
    "    eligible_ante = [v for k,v in names.items() if v.endswith(\"1\")]\n",
    "    \n",
    "    N = input_ass_rules.shape[0]*0.5\n",
    "    \n",
    "    rule_stats = list(rules_stats(rules, itemsets, N))\n",
    "    \n",
    "    rule_list_df = []\n",
    "    for ex_rule_frm_rule_stat in rule_stats:\n",
    "        ante = ex_rule_frm_rule_stat[0]            \n",
    "        cons = ex_rule_frm_rule_stat[1]\n",
    "        named_cons = names[next(iter(cons))]\n",
    "        if named_cons in eligible_ante:\n",
    "            rule_lhs = [names[i][:-2] for i in ante if names[i] in eligible_ante]\n",
    "            ante_rule = ', '.join(rule_lhs)\n",
    "            if ante_rule and len(rule_lhs)>1 :\n",
    "                rule_dict = {'support' : ex_rule_frm_rule_stat[2],\n",
    "                     'confidence' : ex_rule_frm_rule_stat[3],\n",
    "                    'coverage' : ex_rule_frm_rule_stat[4],\n",
    "                     'strength' : ex_rule_frm_rule_stat[5],\n",
    "                     'lift' : ex_rule_frm_rule_stat[6],\n",
    "                    'leverage' : ex_rule_frm_rule_stat[7],\n",
    "                    'antecedent': ante_rule,\n",
    "                    'consequent':named_cons[:-2] }\n",
    "                rule_list_df.append(rule_dict)\n",
    "    rules_df = pd.DataFrame(rule_list_df)\n",
    "    print(\"Raw rules data frame of {} rules generated\".format(rules_df.shape[0]))\n",
    "    if not rules_df.empty:\n",
    "        pruned_rules_df = rules_df.groupby(['antecedent','consequent']).max().reset_index()\n",
    "    else:\n",
    "        print(\"Unable to generate any rule\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Raw rules data frame of 124239 rules generated\n"
     ]
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "invalid syntax (<ipython-input-85-444dfa3237fd>, line 1)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;36m  File \u001b[1;32m\"<ipython-input-85-444dfa3237fd>\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m    pruned_rules_df[['antecedent','consequent','support','confidence','lift']].sort_values(['lift',support','confidence'], ascending=False)\u001b[0m\n\u001b[1;37m                                                                                                            ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n"
     ]
    }
   ],
   "source": [
    "pruned_rules_df[['antecedent','consequent','support','confidence','lift']].sort_values(['lift','support','confidence'], ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "pruned_rules_df.to_csv(path_or_buf='pruned_rule_uk_top10_item.csv', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
